package main;

import java.io.File;
import java.io.FileInputStream;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

public class Alg {
	
	/*
	 * 算法主体
	 * t表示验证器个数
	 * num表示验证器中数据块数量
	 */
	public void algBody(int t,int HC,int num,int s,int dataNum) throws Exception{   
		for (int i = 0; i < t; i++) {
			//1  HC对应一个32位的0 1 Hash值
			int Seedi = HC+i;//种子
			
			/**
			 * S表示num个随机数据块的集合
			 */
			int S = 0;
			
			
			//产生100个数据块
			for (int j = 0; j < 1000; j++) {
				MakeFile.main2(j);
			}
			
			MakeFile.main2(1001);
			
			/*
			 * 
			 */
			for (int j = 0; j < 10; j++) {
				
				/*
				 * tao表示一个随机数，表示的是第几个数据块
				 * 生成的方法用mod伪随机
				 * 
				 */
//				int tao = taohanshu();
				Random random = new Random(j);
				int tao = random.nextInt(100);
				
				/*
				 * change函数表示将种子Seedi变成一个0 1 串
				 */
				List<Integer> RNum = change(Seedi);
				
				int  x = 0;
				
				//1+c1x+c2xpow
				//rand   
				//n与RNum的长度相同
				
				
				List<Integer> zolist = new ArrayList<>();
				for(int n=0;i<32;i++) {
					zolist.add(random.nextInt(1));
				}
				
				List<Integer> clist = new ArrayList<>();
				for(int n=0;i<32;i++) {
					clist.add(random.nextInt(1));
				}
				int sum = 0;
				for(int n=0;i<32;i++) {
					sum+=zolist.get(n)*clist.get(n);
				}
				
				int onebyte = sum%2;
				
				List<Integer> one = new ArrayList<>();
				for(int n=0;i<31;i++) {
					zolist.set(31-n, zolist.get(31-n-1));
				}
				
				zolist.set(0, onebyte);
				
				//将一个数据块继续分成s个数据单元
				for(int m=0;m<s;m++){
					
					/*
					 * AES加密算法
					 * d表示一个数据块中数据单元的位置
					 */
					int d=AES(RNum,10);
					
					/*
					 * 根据获得的位置信息进行修改
					 * 
					 * m表示从头开始覆写的位置
					 */
					
					//覆写待覆写数据块
					//path为覆写器，及验证器
					String path = "D:\\shiyan\\"+"1001text.txt";
					overwritingopt(d,tao,m,path);
					
					
					int n = RNum.get(RNum.size()-1);
					RNum.set(n, opt3()) ;
					
					for (int k = 0; k < n-1; k++) {
						RNum.set(k, RNum.get(k+1));
					}
					
				}
				//opts对
				S=opts();
				
			}
			int thetai = Hash(S);
			
		}
	}
	private int Hash(int s) {
		// TODO Auto-generated method stub
		return 0;
	}
	private int opts() {
		// TODO Auto-generated method stub
		return 0;
	}
	private Integer opt3() {
		// TODO Auto-generated method stub
		return null;
	}
	
	
	private void overwritingopt(int d, int tao, int m,String path) {
        File file 
		FileInputStream fileInputStream = 
		
		
		
	}
	private int AES(List<Integer> v,int s) throws Exception {
		
		return AESTest.main1(v,s);
	}
	private List<Integer> opration1(List<Integer> rNum) {
		// TODO Auto-generated method stub
		return null;
	}
	//将一个种子转换成一个二进制的数组
	private List<Integer> change(int seedi) {
		
		List<Integer> seeds = new ArrayList<Integer>();
		String seedString = Integer.toBinaryString(seedi);
		
		for(int m=0;m<seedString.length();m++) {
			seeds.add(Integer.parseInt((""+seedString.charAt(m)).trim()));
		}
		
		return seeds;
	}

	private void f(int x,int n) {
		int sum = 1;
		for(int i=0;i<n;i++) {
			sum +
		}
		
	}

	private int taohanshu() {
		int i = random.nextInt()+1;
		
		return i;
	}
}
